package com.clstu.queue;

import java.util.Scanner;

/**
 * 演示 数组实现队列(一次使用版本,非环形队列)
 */
public class ArrayQueueDemo {
    public static void main(String[] args) {
        //写一个例子测试是否写对
        //创建一个数组队列
        ArrayQueue queue = new ArrayQueue(4);
        char key = ' ';//接受键盘输入
        Scanner scanner = new Scanner(System.in);
        boolean loop = true;
        while (loop){
            //打印菜单
            System.out.println("\n=======数组队列测试=======");
            System.out.println("s(show)    :显示队列");
            System.out.println("a(add)     :添加数据");
            System.out.println("g(getQueue):从队列取出数据");
            System.out.println("h(head)    :显示队列第一个数据");
            System.out.println("e(exit)    :退出程序");
            System.out.print("请输入:");
            key = scanner.next().charAt(0);
            switch (key){
                case 's':
                    queue.showQueue();
                    break;
                case 'a':
                    System.out.print("请输入数据:");
                    int data = scanner.nextInt();
                    queue.add(data);
                    break;
                case 'g':
                    try {
                        System.out.println(queue.getQueue());
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    break;
                case 'h':
                    try {
                        System.out.println(queue.head());
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    break;
                case 'e':
                    loop = false;
                    break;
            }
        }
        System.out.println("退出程序~~");
    }
}

/**
 * 该类模拟 数组版本的队列结构
 */
class ArrayQueue{
    private int maxSize;//队列最大长度
    private int front;//头位置 -1开始
    private int rear;//尾位置 -1开始
    private int[] arr;//数组,用于存放数据,模拟队列

    //构造器,创建队列
    public ArrayQueue(int maxSize){
        this.maxSize = maxSize;
        arr = new int[maxSize];
        front = -1;//队列头部,指向第一个数据的前一个位置!!!(不是指向第一个数据的)
        rear = -1;//指向尾部,指向的就是最后一个数据
    }

    //编写方法判断是否位空
    public boolean isEmpty(){
        return front==rear;
    }

    //编写方法判断是否满
    public boolean isFull(){
        return rear == maxSize-1;
    }

    //编写方法添加数据
    public void add(int data){
        //先判断队列是否满了
        if(isFull()) {
            System.out.println("队列满,不能加入数据了");
            return;
        }
        //加入数据,加入到最后一个数据
        rear++;//后移
        arr[rear]=data;//在尾部加入数据
    }

    //编写方法取出数据
    public int getQueue(){
        //先判断队列是否空
        if(isEmpty()){
            //直接抛出自定义异常
            throw new RuntimeException("队列空,不能取出数据");//抛出异常就可以不加return 了,会自动终止调用
        }
        //拿出数据,拿出第一个数据
        front++;//后移
        return arr[front];//取出数据
    }

    //编写方法返回第一个数据
    public int head(){
        //先判断是否空
        if(isEmpty()){
            //直接抛出自定义异常
            throw new RuntimeException("队列空,没有数据");//抛出异常就可以不加return 了,会自动终止调用
        }
        //front+1才是第一的数据的位置
        return arr[front+1];
    }

    //编写方法显示所有的队列数据
    public void showQueue(){
        //先判断是否空
        if(isEmpty()){
            System.out.println("队列空,无数据");
            return;
        }
        //显示队列所有数据
        for (int i = front+1; i <= rear; i++) {
            System.out.println(arr[i]);
        }
    }


}
